﻿#pragma once
#include "Frame.h"
#define RED 1
#include<math.h>
#include<queue>
#include "ChainTable.h"


// 模板solver, 是solver的基类, 在GameManager游戏引擎中就是调用solver函数来生成步伐的, 若要拓展算法就继承这个类就行了, frame中可以得到一个回合的所有信息
class TemplateSolver
{
public:
    int reference_player = -1; // 这个代表你在帮哪一方下棋, 红方还是蓝方, 这个属性一次solve()函数内应该被初始化, 并且在这次solve()函数结束之前应该不可变

    //解决方法需要被子类继承(核心)
    virtual Step solve(Frame* frame)
    {
        return { -1, -1, -1 };
    }

    //评价函数, 也需要被子类继承, 这里只提供一个简单的
    virtual int evaluate(Board* board, int turn)
    {
        const int cScore = 20;
        const int cThree = 15;
        const int cTwo = 1;

        int score = 0;
        if (reference_player == RED_)
            score = board->get_current_player_score(RED_) * cScore - board->get_current_player_score(BLUE_) * cScore;
        else
            score = board->get_current_player_score(BLUE_) * cScore - board->get_current_player_score(RED_) * cScore;
        if (reference_player == RED_)
            score += cThree * board->get_box_count(3) - cTwo * board->get_box_count(3);
        else
            score -= cThree * board->get_box_count(3) - cTwo * board->get_box_count(3);

        return score;
    }


    // 记录一些持久化信息
    virtual void record_solver_info(std::string path) {}

    // 记录一些持久化信息
    virtual void record_solver_info(std::ofstream& f) {}

    // 设置思考时间
    virtual void set_move_time(double time) {}
};

